﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace 七天入手上位机第一个项目
{
    public class IniFile
    {
        /// <summary>
        /// 参数字典
        /// </summary>
        public Dictionary<string, string> dictionary = new Dictionary<string, string>();
        /// <summary>
        /// 文件地址路径
        /// </summary>
        public string inipath;
        /// <summary>
        /// 多线程锁
        /// </summary>
        private object lockobj = new object();

        //声明API函数

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        /// <summary> 
        /// 构造方法 
        /// </summary> 
        /// <param name="INIPath">文件路径</param> 
        public IniFile(string INIPath)
        {
            inipath = INIPath;
        }
        /// <summary> 
        /// 写入INI文件 
        /// </summary> 
        /// <param name="Section">项目名称(如 [TypeName] )</param> 
        /// <param name="Key">键</param> 
        /// <param name="Value">值</param> 
        public void IniWriteValue(string Section, string Key, string Value)
        {
            lock (lockobj)
            {
                Section = Section.Replace("=", "%equal");
                Key = Key.Replace("=", "%equal");
                if (dictionary.ContainsKey(Section + ">" + Key))
                {
                    dictionary[Section + ">" + Key] = Value;
                }
                else
                {
                    dictionary.Add(Section + ">" + Key, Value);
                }
                Value = Value.Replace("\r", "/r").Replace("\n", "/n");
                string[] path1 = inipath.Split('\\');
                string pathiofo = "";
                for (int i = 0; i < path1.Length - 1; i++)
                {
                    pathiofo += path1[i] + "\\";
                }
                DirectoryInfo ff = new DirectoryInfo(pathiofo);
                if (!ff.Exists)
                {
                    ff.Create();
                }
                WritePrivateProfileString(Section, Key, Value, this.inipath);
            }
        }
        /// <summary> 
        /// 读出INI文件 
        /// </summary> 
        /// <param name="Section">项目名称(如 [TypeName] )</param> 
        /// <param name="Key">键</param> 
        public string IniReadValue(string Section, string Key,bool ReadOnlyOne=true)
        {
            if (ReadOnlyOne)
            {
                Section = Section.Replace("=", "%equal");
                Key = Key.Replace("=", "%equal");
                if (dictionary.ContainsKey(Section + ">" + Key))
                {
                    return dictionary[Section + ">" + Key];
                }
                lock (lockobj)
                {
                    StringBuilder temp = new StringBuilder(500);
                    int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.inipath);
                    if (i == 0) { IniWriteValue(Section, Key, ""); }
                    if (!dictionary.ContainsKey(Section + ">" + Key))
                    {
                        dictionary.Add(Section + ">" + Key, temp.ToString().Replace("/r", "\r").Replace("/n", "\n"));
                    }
                    return dictionary[Section + ">" + Key];
                }
            }
            else
            {
                Section = Section.Replace("=", "%equal");
                Key = Key.Replace("=", "%equal");
                lock (lockobj)
                {
                    StringBuilder temp = new StringBuilder(500);
                    int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.inipath);
                    if (i == 0) { IniWriteValue(Section, Key, ""); }
                    //if (!dictionary.ContainsKey(Section + ">" + Key))
                    //{
                    //    dictionary.Add(Section + ">" + Key, temp.ToString().Replace("/r", "\r").Replace("/n", "\n"));
                    //}
                    return temp.ToString().Replace("/r", "\r").Replace("/n", "\n");
                }
            }
          
        }
        /// <summary> 
        /// 验证文件是否存在 
        /// </summary> 
        /// <returns>布尔值</returns> 
        public bool ExistINIFile()
        {
            return File.Exists(inipath);
        }
    }
}